﻿#pragma once
#include "common_data.h"


enum class RobotBrand {	// 机械手款型枚举
	robot_brand_test = 0,	// 测试
	robot_brand_ABB = 1,
	robot_brand_KUKA = 2,
	robot_brand_Estun = 3,
	robot_brand_Fanuc = 4,

	robot_brand_max,
};

/*机械手配置*/
struct RobotSetting {
	QString id;
	QString brand;
	QString ip;
	int statePort;
	int cmdPort;
	Position origin;	// 原点坐标
};



/*wcs 通信配置*/
struct WCSSetting {
	int type;	// 协议类型
	QString robIP;
	int robPort;
	QString wcsIP;
	int wcsport;
};

/*相机配置*/
struct CameraSetting {
	QString id;
	QString type;	// 0: 美卡曼德 1:图漾
	QString ip;
	QString alg;
	QString biaoding;
	QString visPath;
	QString picPath;
};

/**********************业务线配置*****************************/


enum class PathPointMathType {
	path_point_math_fixed = 0,		// 固定点
	path_point_math_relative = 1,	// 相对位置
	path_point_math_grab = 2,			// 抓取点
	path_piont_math_putdown = 3,			// 放置点
	path_piont_math_origin = 4,			// 原点
};

/*相对位置点参数*/
struct RelativePoint {
	bool fix_x;
	bool fix_y;
	bool fix_z;
	bool fix_a;
	bool fix_b;
	bool fix_c;
	Position diff;
	int relateNum;	 // -1: 前一个点， 1:表示后一个点
};
/*抓取点或放置点参数*/
struct LocationPoint {
	int type;		// 位置点的类型，0：输送线 1：码垛托盘 2：拆垛托盘
	QString id;		// 位置点编号
};

enum class PiontActionType {
	piont_action_no = 0,	// 无动作
	point_action_jig = 1,	// 夹具动作
	point_action_camera = 2,	// 拍照动作
	point_action_notify = 3,	// 通知动作
};

struct PointAction {
	PiontActionType type;
	QString param;
};

struct PathPointSetting {
	int id;		// 路径点编号
	QString name;	// 路径点名称
	int type;	// 类型：0:关节点 1：直线点
	bool stop;	// 停止点
	int acc;	// 加速度
	int vel;	// 速度
	int zone;	// 圆滑距离
	PathPointMathType math;		// 路径计算方式
	Position fix;		// 固定点参数
	RelativePoint relate;	// 相对位置点参数
	LocationPoint location;		// 抓取点或放置点参数
	PointAction action;		// 点位动作
};

struct PathSetting {
	int id;
	QList<PathPointSetting> points;
	QString name;
};

struct PipelineSetting {
	QString id;
	QString rob;
	QList<PathSetting> paths;
	int type;		// 业务线类型
	QString strat;	// 抓取点
	QString end;	// 放置点
};

/**************************位置信息*****************************/
struct JigSetting {
	int id;
	int type;
	Size size;
	Position rob;	// 法兰坐标
};


struct UnstackAlgSetting {
	QString calibration;	// 标定文件
	JigSetting jig;
	int dirX;		// X轴拆垛方向 0：从小到大 1：从大到小
	int dirY;		// y轴拆垛方向
	Size maxSku;	// 最大物料尺寸
	Size minSku;	// 最小物料尺寸
	bool sizeCheck;	 // 物料尺寸校验
	int maxnum;	// 最大拆垛数量
};

/*码垛托盘配置*/
struct StackPlateSetting {
	QString id;
	int di;
	int  dirOdd;	// 码垛方向
	int dirEven;
	Position base;
	QString alg;
	Size maxsize;
};

/*码垛托盘配置*/
struct PlateStackSetting {
	bool valid;		// 是否启用
	QString id;
	QString rob;
	int minDi;		// 光电di范围
	int  maxDi;		// 
	int plateH;		// 托盘高度
	Position base;
};


/*拆垛托盘配置*/
struct UnstackPlateSetting {
	QString id;
	QString camera;
	int dir;
	int max;
};

/*输送线点位配置*/
struct BoxlineSetting {
	QString id;
	int type;
	int posid;
	int dir;		// 来货方向 0：横向(箱子长和输送线坐标系的X轴平行) 1：纵向
	QVector<int> di;
	QVector<QString> dival;
	Position base;
	QString alg;
};

struct InputWare {
	QString name;
	int di;		// 对应di编号
	int val;	// 触发时的状态值
};

struct OutputWare {
	QString name;
	int dox;		// 对应do编号
	int val;	// 触发时的状态值
};

struct SafedoorSetting {
	bool enable;
	int stop;
	int reset;
	int start;
	int enter;
};

struct GratingSetting {
	QString id;
	bool enable;
	int trig;
	int fault;
};

struct AlarmSetting {
	bool enable;
	int red;
	int green;
	int yellow;
};

struct SafeLockSetting {
	bool enable;
	int state;
	int set;
};
